home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / sml_nj / cml-098.lha / cml-0.9.8 / examples / ex-buffer.sml < prev    next >
Encoding:
Text File  |  1991-06-14  |  1.0 KB  |  37 lines

  1. (* ex-buffer.sml
  2.  *
  3.  * COPYRIGHT (c) 1990 by John H. Reppy.  See COPYRIGHT file for details.
  4.  *
  5.  * This is an implementation unbounded buffered channels.  Send operations never
  6.  * block, but accept/receive operations may.
  7.  *)
  8.  
  9. (* BEGIN EXAMPLE *)
  10. functor BufferChan (CML : CONCUR_ML) : BUFFER_CHAN =
  11.   struct
  12.     structure CML = CML
  13.  
  14.     open CML
  15.  
  16.     datatype 'a buffer_chan = BC of {inch : 'a chan, outch : 'a chan}
  17.  
  18.     fun buffer () = let
  19.       val inCh = channel() and outCh = channel()
  20.       fun loop ([], []) = loop([accept inCh], [])
  21.         | loop (front as (x::r), rear) = select [
  22.           wrap (receive inCh, fn y => loop(front, y::rear)),
  23.           wrap (transmit(outCh, x), fn () => loop(r, rear))
  24.         ]
  25.         | loop ([], rear) = loop(List.rev rear, [])
  26.       in
  27.         spawn (fn () => loop([], []));
  28.         BC{inch=inCh, outch=outCh}
  29.       end
  30.  
  31.     fun bufferSend (BC{inch, ...}, x) = send(inch, x)
  32.     fun bufferAccept (BC{outch, ...}) = accept outch
  33.     fun bufferReceive (BC{outch, ...}) = receive outch
  34.  
  35.   end (* functor BufferChan *)
  36. (* END EXAMPLE *)
  37.